<?php

App::import('Sanitize');

class ElementosInfraestructurasController extends AppController {

    var $name = 'ElementosInfraestructuras';
    var $paginate = array(
        'recursive' => 0,
        'order' => array('ElementosInfraestructura.id ASC'),
        'limit' => 10,
    );

    function beforeFilter() {
        parent::beforeFilter();
        //$this->Auth->allow();
    }

    function add_elementos_infraestructura() {
        $this->__aux_add_elementos_infraestructura();
    }

    function admin_add_elementos_infraestructura() {
        $this->__aux_add_elementos_infraestructura();
    }

    /**
     * Permite dar de alta un nuevo elemento de la infraestructura de una obra de arte
     */
    function __aux_add_elementos_infraestructura() {
        $this->layout = false;

        if ($this->Session->check('id_obra')) {
            $obra_id = $this->Session->read('id_obra');

            $obra = $this->Obra->findById($obra_id);
            $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;

            $menuesInfraestructuras = $this->ElementosInfraestructura->MenuesInfraestructura->find('list',
                            array('fields' => array('MenuesInfraestructura.id', 'MenuesInfraestructura.nombre'), 'order' => 'MenuesInfraestructura.nombre',
                                'conditions' => array('MenuesInfraestructura.obras_tipo_id' => $obras_tipo_id)));

            $materiales = $this->ElementosInfraestructura->Materiale->find('list', array('fields' => array('Materiale.id', 'Materiale.nombre'), 'order' => 'Materiale.nombre'));

            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre'), 'order' => 'Estado.nombre'));


            if (!empty($this->data)) {
                $this->ElementosInfraestructura->begin();
                $this->data['ElementosInfraestructura']['fecha_actualizacion'] = date("Y-m-d H:i:s");
                if (!empty($obra_id)) {
                    $this->data['ElementosInfraestructura']['obra_id'] = $obra_id;
                    $this->__save_elementos_infraestructura($obra_id, $this->data);
                } else {
                    $this->ElementosInfraestructura->rollback();
                    echo 'El elemento de la infraestructura no se ha podido guardar porque perdió la sesión.';
                    exit;
                }
            }
            $referer = $this->referer();
            $this->set(compact('menuesInfraestructuras', 'materiales', 'estados', 'referer'));
            $this->render('add_elementos_infraestructura');
        } else {
            $mensaje = 'Para poder dar de alta elementos de la infraestructura, primero debe dar de alta una obra de arte en la sopala "General"';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function view_elementos_infraestructura() {
        $this->__aux_view_elementos_infraestructura();
    }

    function admin_view_elementos_infraestructura() {
        $this->__aux_view_elementos_infraestructura();
    }

    /**
     * Lista todos los elementos de la infraestructura de la obra que se está dando de alta
     */
    function __aux_view_elementos_infraestructura() {
        $this->layout = false;
        $obra_id = ($this->Session->check('id_obra')) ? $this->Session->read('id_obra') : 0;
        $obra = $this->ElementosInfraestructura->Obra->findById($obra_id);
        $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';

        $this->set('obra_nombre', $obra_nombre);
        $this->set('elementosInfraestructuras', $this->paginate('ElementosInfraestructura', array('ElementosInfraestructura.obra_id' => $obra_id)));
        $this->render('view_elementos_infraestructura');
    }

    function delete_elemento_infraestructura($id = null) {
        $this->__aux_delete_elemento_infraestructura($id);
    }

    function admin_delete_elemento_infraestructura($id = null) {
        $this->__aux_delete_elemento_infraestructura($id);
    }

    /**
     * Elimina un elemento de la infraestructura
     */
    function __aux_delete_elemento_infraestructura($id = null) {
        $this->layout = false;
        if (!empty($id)) {
            $datos_elemento_infraestructura = $this->ElementosInfraestructura->findById($id, array('recursive' => 0));

            if (!empty($datos_elemento_infraestructura)) {

                // Chequeo si hay evaluaciones realizadas a dicho elemento
                $evaluacion = $this->ElementosInfraestructurasEval->find('all', array('conditions' => array('ElementosInfraestructurasEval.elementos_infraestructura_id' => $id)));
                if (empty($evaluacion)) {

                    // Chequeo si hay intervenciones realizadas a dicho elemento
                    $intervencion = $this->ElementosInfraestructurasInter->find('all', array('conditions' => array('ElementosInfraestructurasInter.elementos_infraestructura_id' => $id)));
                    if (empty($intervencion)) {

                        if ($this->ElementosInfraestructura->delete($id)) {
                            echo 'El elemento de la infraestructura se eliminó correctamente.';
                            exit;
                        } else {
                            echo 'Error: El elemento de la infraestructura no se pudo eliminar.';
                            exit;
                        }
                    } else {
                        echo 'Error: El elemento de la infraestructura no se puede eliminar porque existen intervenciones realizadas a dicho elemento.';
                        exit;
                    }
                } else {
                    echo 'Error: El elemento de la infraestructura no se puede eliminar porque existen evaluaciones realizadas a dicho elemento.';
                    exit;
                }
            } else {
                echo 'Error: No se encontró el elemento de la infraestructura en la db.';
                exit;
            }
        }
    }

    function evaluacion_elementos_infraestructura() {
        $this->__aux_evaluacion_elementos_infraestructura();
    }

    function admin_evaluacion_elementos_infraestructura() {
        $this->__aux_evaluacion_elementos_infraestructura();
    }

    /**
     * Permite registrar la evaluación de un elemento de la infraestructura de una obra de arte
     */
    function __aux_evaluacion_elementos_infraestructura() {
        $this->layout = false;

        if ($this->Session->check('id_evaluacione')) {
            $evaluacione_id = $this->Session->read('id_evaluacione');
            $evaluacion = $this->Evaluacione->findById($evaluacione_id);

            $obras_tipo_id = 0;
            $obra_id = 0;
            if (!empty($evaluacion)) {
                $obra_id = $evaluacion['Evaluacione']['obra_id'];
                $obra = $this->Obra->findById($obra_id);
                $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;
            }

            $menuesInfraestructuras = $this->ElementosInfraestructura->MenuesInfraestructura->find('list',
                            array('fields' => array('MenuesInfraestructura.id', 'MenuesInfraestructura.nombre'), 'order' => 'MenuesInfraestructura.nombre',
                                'conditions' => array('MenuesInfraestructura.obras_tipo_id' => $obras_tipo_id)));

            $materiales = $this->ElementosInfraestructura->Materiale->find('list', array('fields' => array('Materiale.id', 'Materiale.nombre'), 'order' => 'Materiale.nombre'));

            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre'), 'order' => 'Estado.nombre'));

            if (!empty($this->data)) {
                $this->__save_evaluacion_elementos_infraestructura($this->data);
            }

            $referer = $this->referer();
            $this->set(compact('menuesInfraestructuras', 'materiales', 'estados', 'evaluacione_id', 'referer'));
            $this->render('evaluacion_elementos_infraestructura');
        } else {
            $mensaje = 'Para poder registrar la evaluación de un elemento de la infraestructura, primero debe dar de alta una evaluación en la sopala "General"';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function listado_elementos_infraestructura_evals() {
        $this->__aux_listado_elementos_infraestructura_evals();
    }

    function admin_listado_elementos_infraestructura_evals() {
        $this->__aux_listado_elementos_infraestructura_evals();
    }

    /**
     * Lista todos los elementos de la infraestructura de la obra para la cual se está registrando
     * la evaluación
     */
    function __aux_listado_elementos_infraestructura_evals() {
        $this->layout = false;

        $id_evaluacione = ($this->Session->check('id_evaluacione')) ? $this->Session->read('id_evaluacione') : 0;
        $evaluacion = $this->Evaluacione->findById($id_evaluacione);

        $obra_nombre = '';
        $obra_id = 0;
        if (!empty($evaluacion)) {
            $obra_id = $evaluacion['Evaluacione']['obra_id'];
            $obra = $this->Obra->findById($obra_id);
            $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';
        }
        $this->set('obra_nombre', $obra_nombre);
        $this->set('elementosInfraestructurasEvals', $this->paginate('ElementosInfraestructura', array('ElementosInfraestructura.obra_id' => $obra_id)));
        $this->render('listado_elementos_infraestructura_evaluacion');
    }

    function read_elemento_infraestructura($id = null) {
        $this->__aux_read_elemento_infraestructura($id);
    }

    function admin_read_elemento_infraestructura($id = null) {
        $this->__aux_read_elemento_infraestructura($id);
    }

    /**
     * Recupera un elemento de la infraestructura de la db y devuelve su información
     * como un string separado por "|":
     * id|obra_id|menues_infraestructura_id|materiale_id|tipo|cantidad|descripcion|estado_erosion_hidraulica|fundacion|estado_id
     */
    function __aux_read_elemento_infraestructura($id = null) {
        $elemento_infraestructura = '';
        if (!empty($id)) {
            $elemento = $this->ElementosInfraestructura->findById($id, array('recursive' => 0));
            if (!empty($elemento)) {
                $elemento_infraestructura = $elemento['ElementosInfraestructura']['id'] . '|' .
                        $elemento['ElementosInfraestructura']['obra_id'] . '|' .
                        $elemento['ElementosInfraestructura']['menues_infraestructura_id'] . '|' .
                        $elemento['ElementosInfraestructura']['materiale_id'] . '|' .
                        $elemento['ElementosInfraestructura']['tipo'] . '|' .
                        $elemento['ElementosInfraestructura']['cantidad'] . '|' .
                        $elemento['ElementosInfraestructura']['descripcion'] . '|' .
                        $elemento['ElementosInfraestructura']['estado_erosion_hidraulica'] . '|' .
                        $elemento['ElementosInfraestructura']['fundacion'] . '|' .
                        $elemento['ElementosInfraestructura']['estado_id'];
            }
        }
        echo $elemento_infraestructura;
        exit;
    }

    ///////////////

    function intervencion_elementos_infraestructura() {
        $this->__aux_intervencion_elementos_infraestructura();
    }

    function admin_intervencion_elementos_infraestructura() {
        $this->__aux_intervencion_elementos_infraestructura();
    }

    /**
     * Permite registrar la intervención de un elemento de la infraestructura de una obra de arte
     */
    function __aux_intervencion_elementos_infraestructura() {
        $this->layout = false;

        if ($this->Session->check('id_intervencione')) {
            $intervencione_id = $this->Session->read('id_intervencione');
            $intervencion = $this->Intervencione->findById($intervencione_id);

            $obras_tipo_id = 0;
            $obra_id = 0;
            if (!empty($intervencion)) {
                $obra_id = $intervencion['Intervencione']['obra_id'];
                $obra = $this->Obra->findById($obra_id);
                $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;
            }

            $menuesInfraestructuras = $this->ElementosInfraestructura->MenuesInfraestructura->find('list',
                            array('fields' => array('MenuesInfraestructura.id', 'MenuesInfraestructura.nombre'), 'order' => 'MenuesInfraestructura.nombre',
                                'conditions' => array('MenuesInfraestructura.obras_tipo_id' => $obras_tipo_id)));

            $materiales = $this->ElementosInfraestructura->Materiale->find('list', array('fields' => array('Materiale.id', 'Materiale.nombre'), 'order' => 'Materiale.nombre'));

            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre'), 'order' => 'Estado.nombre'));

            if (!empty($this->data)) {
                $this->__save_intervencion_elementos_infraestructura($this->data);
            }

            $referer = $this->referer();
            $this->set(compact('menuesInfraestructuras', 'materiales', 'estados', 'intervencione_id', 'referer'));
            $this->render('intervencion_elementos_infraestructura');
        } else {
            $mensaje = 'Para poder registrar la intervención de un elemento de la infraestructura, primero debe dar de alta una intervención en la sopala "General"';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function listado_elementos_infraestructura_inters() {
        $this->__aux_listado_elementos_infraestructura_inters();
    }

    function admin_listado_elementos_infraestructura_inters() {
        $this->__aux_listado_elementos_infraestructura_inters();
    }

    /**
     * Lista todos los elementos de la infraestructura de la obra para la cual se está registrando
     * la intervención
     */
    function __aux_listado_elementos_infraestructura_inters() {
        $this->layout = false;

        $id_intervencione = ($this->Session->check('id_intervencione')) ? $this->Session->read('id_intervencione') : 0;
        $intervencion = $this->Intervencione->findById($id_intervencione);

        $obra_nombre = '';
        $obra_id = 0;
        if (!empty($intervencion)) {
            $obra_id = $intervencion['Intervencione']['obra_id'];
            $obra = $this->Obra->findById($obra_id);
            $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';
        }
        $this->set('obra_nombre', $obra_nombre);
        $this->set('elementosInfraestructurasInters', $this->paginate('ElementosInfraestructura', array('ElementosInfraestructura.obra_id' => $obra_id)));
        $this->render('listado_elementos_infraestructura_intervencion');
    }

    function edit_elementos_infraestructura($obra_id = null) {
        $this->__aux_edit_elementos_infraestructura($obra_id);
    }

    function admin_edit_elementos_infraestructura($obra_id = null) {
        $this->__aux_edit_elementos_infraestructura($obra_id);
    }

    /**
     * Permite editar un elemento de la infraestructura de una obra de arte
     */
    function __aux_edit_elementos_infraestructura($obra_id = null) {
        $this->layout = false;
        $menuesInfraestructuras = array();
        $materiales = array();
        $estados = array();

        if (!empty($obra_id)) {
            $obra = $this->Obra->findById($obra_id);
            $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;

            $menuesInfraestructuras = $this->ElementosInfraestructura->MenuesInfraestructura->find('list',
                            array('fields' => array('MenuesInfraestructura.id', 'MenuesInfraestructura.nombre'), 'order' => 'MenuesInfraestructura.nombre',
                                'conditions' => array('MenuesInfraestructura.obras_tipo_id' => $obras_tipo_id)));

            $materiales = $this->ElementosInfraestructura->Materiale->find('list', array('fields' => array('Materiale.id', 'Materiale.nombre'), 'order' => 'Materiale.nombre'));

            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre'), 'order' => 'Estado.nombre'));
        } elseif (!empty($this->data)) {
            $this->ElementosInfraestructura->begin();
            $obra_id = (isset($this->data['ElementosInfraestructura']['obra_id']) && (!empty($this->data['ElementosInfraestructura']['obra_id']))) ? $this->data['ElementosInfraestructura']['obra_id'] : 0;
            $this->data['ElementosInfraestructura']['fecha_actualizacion'] = date("Y-m-d H:i:s");
            $this->__save_elementos_infraestructura($obra_id, $this->data);
        }
        $referer = $this->referer();
        $this->set(compact('obra_id', 'menuesInfraestructuras', 'materiales', 'estados', 'referer'));
        $this->render('edit_elementos_infraestructura');
    }

    function view_edit_elementos_infraestructura($obra_id = null) {
        $this->__aux_view_edit_elementos_infraestructura($obra_id);
    }

    function admin_view_edit_elementos_infraestructura($obra_id = null) {
        $this->__aux_view_edit_elementos_infraestructura($obra_id);
    }

    /**
     * Lista todos los elementos de la infraestructura de la obra que se está editando
     */
    function __aux_view_edit_elementos_infraestructura($obra_id = null) {
        $this->layout = false;
        if (!empty($obra_id)) {
            $obra = $this->ElementosInfraestructura->Obra->findById($obra_id);
            $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';

            $this->set('obra_nombre', $obra_nombre);
            $this->set('elementosInfraestructuras', $this->paginate('ElementosInfraestructura', array('ElementosInfraestructura.obra_id' => $obra_id)));
            $this->render('view_edit_elementos_infraestructura');
        }
    }

    function __save_elementos_infraestructura($obra_id = null, $data = null) {
        if (!empty($obra_id) && !empty($data)) {
            /** Chequeo si no existe en la db un elemento de la infraestructura con los mismos datos:
             * menues_infraestructura_id
             * materiale_id
             * obra_id
             */
            if (isset($this->data['ElementosInfraestructura']['id']) && (!empty($this->data['ElementosInfraestructura']['id']))) {
                $elemento = $this->ElementosInfraestructura->find('all', array('conditions' => array('ElementosInfraestructura.id <>' => $this->data['ElementosInfraestructura']['id'], 'ElementosInfraestructura.menues_infraestructura_id' => $this->data['ElementosInfraestructura']['menues_infraestructura_id'], 'ElementosInfraestructura.materiale_id' => $this->data['ElementosInfraestructura']['materiale_id'], 'ElementosInfraestructura.obra_id' => $this->data['ElementosInfraestructura']['obra_id'])));
            } else {
                $elemento = $this->ElementosInfraestructura->find('all', array('conditions' => array('ElementosInfraestructura.menues_infraestructura_id' => $this->data['ElementosInfraestructura']['menues_infraestructura_id'], 'ElementosInfraestructura.materiale_id' => $this->data['ElementosInfraestructura']['materiale_id'], 'ElementosInfraestructura.obra_id' => $this->data['ElementosInfraestructura']['obra_id'])));
            }

            if (empty($elemento)) {

                $this->ElementosInfraestructura->create();
                if ($this->ElementosInfraestructura->save($this->data)) {
                    if ($this->NivelServicio->save($obra_id)) {
                        $this->ElementosInfraestructura->commit();
                        echo 'El elemento de la infraestructura se guardó correctamente.';
                        exit;
                    } else {
                        $this->ElementosInfraestructura->rollback();
                        echo 'El elemento de la infraestructura no se ha podido guardar.';
                        exit;
                    }
                } else {
                    $this->ElementosInfraestructura->rollback();
                    echo 'El elemento de la infraestructura no se ha podido guardar.';
                    exit;
                }
            } else {
                $this->ElementosInfraestructura->rollback();
                echo 'El elemento de la infraestructura ya existe.';
                exit;
            }
        }
    }

    function edit_evaluacion_elementos_infraestructura($evaluacione_id = null) {
        $this->__aux_edit_evaluacion_elementos_infraestructura($evaluacione_id);
    }

    function admin_edit_evaluacion_elementos_infraestructura($evaluacione_id = null) {
        $this->__aux_edit_evaluacion_elementos_infraestructura($evaluacione_id);
    }

    /**
     * Permite editar la evaluación de un elemento de la infraestructura de una obra de arte
     * @param <type> $evaluacione_id
     */
    function __aux_edit_evaluacion_elementos_infraestructura($evaluacione_id = null) {
        $this->layout = false;

        if (!empty($this->data)) {
            $evaluacione_id = $this->data['Evaluacione']['evaluacione_id'];
        }

        // Verifico si la evaluación que se está queriendo editar es la última evaluación
        // cargada para la obra de arte, si es asi, modifico sin problemas,
        // de lo contrario, le muestro al usuario una vista informativa,
        // indicándole que no puede editar una evaluación vieja, porque
        // modificaría el estado actual del elemento de la infraestructura, con un estado inconsistente

        if ($this->lastEvaluacion($evaluacione_id)) {

            $materiales = $this->ElementosInfraestructura->Materiale->find('list', array('fields' => array('Materiale.id', 'Materiale.nombre'), 'order' => 'Materiale.nombre'));
            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre'), 'order' => 'Estado.nombre'));
            $menuesInfraestructuras = array();

            if (empty($this->data)) {
                if (!empty($evaluacione_id)) {
                    $evaluacione = $this->Evaluacione->findById($evaluacione_id);

                    if (!empty($evaluacione)) {
                        $obra = $this->Obra->findById($evaluacione['Evaluacione']['obra_id']);
                        $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;

                        $menuesInfraestructuras = $this->ElementosInfraestructura->MenuesInfraestructura->find('list',
                                        array('fields' => array('MenuesInfraestructura.id', 'MenuesInfraestructura.nombre'), 'order' => 'MenuesInfraestructura.nombre',
                                            'conditions' => array('MenuesInfraestructura.obras_tipo_id' => $obras_tipo_id)));
                    }
                }
            } else {
                $this->__save_evaluacion_elementos_infraestructura($this->data);
            }
            $referer = $this->referer();
            $this->set(compact('menuesInfraestructuras', 'materiales', 'estados', 'evaluacione_id', 'referer'));
            $this->render('edit_evaluacion_elementos_infraestructura');
        } else {
            $mensaje = 'No es posible editar la evaluación de los elementos de la infraestructura, porque la evaluación que está modificando no es la última evaluación cargada para la obra de arte. Modificar una evaluación vieja, provocaría un cambio en el estado actual de los elementos de la infraestructura con un estado inconsistente.';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function listado_elementos_infraestructura_edit_evals($evaluacione_id = null) {
        $this->__aux_listado_elementos_infraestructura_edit_evals($evaluacione_id);
    }

    function admin_listado_elementos_infraestructura_edit_evals($evaluacione_id = null) {
        $this->__aux_listado_elementos_infraestructura_edit_evals($evaluacione_id);
    }

    /**
     * Lista todos los elementos de la infraestructura de la obra para la cual se está registrando
     * la evaluación
     */
    function __aux_listado_elementos_infraestructura_edit_evals($evaluacione_id = null) {
        $this->layout = false;

        if (!empty($evaluacione_id)) {
            $evaluacion = $this->Evaluacione->findById($evaluacione_id);

            $obra_nombre = '';
            $obra_id = 0;
            if (!empty($evaluacion)) {
                $obra_id = $evaluacion['Evaluacione']['obra_id'];
                $obra = $this->Obra->findById($obra_id);
                $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';
            }
            $this->set('obra_nombre', $obra_nombre);
            $this->set('elementosInfraestructurasEvals', $this->paginate('ElementosInfraestructura', array('ElementosInfraestructura.obra_id' => $obra_id)));
            $this->render('listado_elementos_infraestructura_editar_evaluacion');
        }
    }

    function __save_evaluacion_elementos_infraestructura($data = null) {
        if (!empty($data)) {
            if (!empty($data['Evaluacione']['evaluacione_id']) && !empty($data['ElementosInfraestructura']['id'])) {

                // Verifico si ya existe una evaluación registrada para el elemento que estoy editando
                $evaluacion_registrada = $this->ElementosInfraestructurasEval->find('all', array('conditions' => array('ElementosInfraestructurasEval.evaluacione_id' => $data['Evaluacione']['evaluacione_id'], 'ElementosInfraestructurasEval.elementos_infraestructura_id' => $data['ElementosInfraestructura']['id'])));

                // Busco en la db, la información actual del elemento de la infraestructura
                $elemento = $this->ElementosInfraestructura->findById($data['ElementosInfraestructura']['id'], array('recursive' => 0));

                $this->ElementosInfraestructura->begin();
                if (empty($evaluacion_registrada)) {
                    // Si no existe evaluación, guardo la información actual del elemento de la infraestructura en el historial de evaluaciones (elementos_infraestructuras_evals)

                    $elementos_infraestructura_eval = array();
                    if (!empty($elemento)) {
                        // Armo el array para hacer el save en el historial de evaluaciones (en el modelo "ElementosInfraestructurasEval")
                        $elementos_infraestructura_eval['ElementosInfraestructurasEval'] = $elemento['ElementosInfraestructura'];
                        $elementos_infraestructura_eval['ElementosInfraestructurasEval']['evaluacione_id'] = $data['Evaluacione']['evaluacione_id'];
                        if (!empty($elementos_infraestructura_eval)) {
                            $elementos_infraestructura_eval['ElementosInfraestructurasEval']['elementos_infraestructura_id'] = $elementos_infraestructura_eval['ElementosInfraestructurasEval']['id'];
                            unset($elementos_infraestructura_eval['ElementosInfraestructurasEval']['id']);
                            unset($elementos_infraestructura_eval['ElementosInfraestructurasEval']['obra_id']);

                            // Guardo en el historial de evaluaciones (en el modelo "ElementosInfraestructurasEval")
                            $this->ElementosInfraestructurasEval->create();
                            if (!$this->ElementosInfraestructurasEval->save($elementos_infraestructura_eval)) {
                                $this->ElementosInfraestructura->rollback();
                                echo 'La evaluación del elemento de la infraestructura no se ha podido guardar.';
                                exit;
                            }
                        }
                    }
                }
                if (!empty($elemento)) {
                    // Antes de modificar la información del elemento de la infraestructura en el modelo
                    // "ElementosInfraestructura", para registrar el resultado de la evaluación del elemento:
                    // Primero verifico que la descripción y/o el estado y/o el estado de erosión hidráulica
                    // y/o la fundación del elemento se hayan modificado,
                    // en caso contrario, no registro la evaluación del elemento

                    $descripcion_actual = $elemento['ElementosInfraestructura']['descripcion'];
                    $estado_actual = $elemento['ElementosInfraestructura']['estado_id'];
                    $estado_erosion_hidraulica_actual = $elemento['ElementosInfraestructura']['estado_erosion_hidraulica'];
                    $fundacion_actual = $elemento['ElementosInfraestructura']['fundacion'];

                    $descripcion_evaluacion = $data['ElementosInfraestructura']['descripcion'];
                    $estado_evaluacion = $data['ElementosInfraestructura']['estado_id'];
                    $estado_erosion_hidraulica_evaluacion = $data['ElementosInfraestructura']['estado_erosion_hidraulica'];
                    $fundacion_evaluacion = $data['ElementosInfraestructura']['fundacion'];

                    if (($descripcion_actual != $descripcion_evaluacion) || ($estado_actual != $estado_evaluacion) ||
                            ($estado_erosion_hidraulica_actual != $estado_erosion_hidraulica_evaluacion) || ($fundacion_actual != $fundacion_evaluacion)) {

                        $data['ElementosInfraestructura']['fecha_actualizacion'] = date("Y-m-d H:i:s");
                        $elementos_infraestructura['ElementosInfraestructura'] = $data['ElementosInfraestructura'];

                        if ($this->ElementosInfraestructura->save($elementos_infraestructura)) {
                            if ($this->NivelServicio->save($elemento['ElementosInfraestructura']['obra_id'])) {
                                $this->ElementosInfraestructura->commit();
                                echo 'La evaluación del elemento de la infraestructura se guardó correctamente.';
                                exit;
                            } else {
                                $this->ElementosInfraestructura->rollback();
                                echo 'La evaluación del elemento de la infraestructura no se ha podido guardar.';
                                exit;
                            }
                        } else {
                            $this->ElementosInfraestructura->rollback();
                            echo 'La evaluación del elemento de la infraestructura no se ha podido guardar.';
                            exit;
                        }
                    } else {
                        $this->ElementosInfraestructura->rollback();
                        echo 'La evaluación del elemento de la infraestructura no se ha guardado, porque no se ha modificado la información actual del elemento.';
                        exit;
                    }
                } else {
                    $this->ElementosInfraestructura->rollback();
                    echo 'La evaluación del elemento de la infraestructura no se ha podido guardar.';
                    exit;
                }
            }
        }
    }


    function edit_intervencion_elementos_infraestructura($intervencione_id = null) {
        $this->__aux_edit_intervencion_elementos_infraestructura($intervencione_id);
    }

    function admin_edit_intervencion_elementos_infraestructura($intervencione_id = null) {
        $this->__aux_edit_intervencion_elementos_infraestructura($intervencione_id);
    }

    /**
     * Permite editar la intervención de un elemento de la infraestructura de una obra de arte
     * @param <type> $intervencione_id
     */
    function __aux_edit_intervencion_elementos_infraestructura($intervencione_id = null) {
        $this->layout = false;

        if (!empty($this->data)) {
            $intervencione_id = $this->data['Intervencione']['intervencione_id'];
        }

        // Verifico si la intervención que se está queriendo editar es la última intervención
        // cargada para la obra de arte, si es asi, modifico sin problemas,
        // de lo contrario, le muestro al usuario una vista informativa,
        // indicándole que no puede editar una intervención vieja, porque
        // modificaría el estado actual del elemento de la infraestructura, con un estado inconsistente

        if ($this->lastIntervencion($intervencione_id)) {

            $materiales = $this->ElementosInfraestructura->Materiale->find('list', array('fields' => array('Materiale.id', 'Materiale.nombre'), 'order' => 'Materiale.nombre'));
            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre'), 'order' => 'Estado.nombre'));
            $menuesInfraestructuras = array();

            if (empty($this->data)) {
                if (!empty($intervencione_id)) {
                    $intervencione = $this->Intervencione->findById($intervencione_id);

                    if (!empty($intervencione)) {
                        $obra = $this->Obra->findById($intervencione['Intervencione']['obra_id']);
                        $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;

                        $menuesInfraestructuras = $this->ElementosInfraestructura->MenuesInfraestructura->find('list',
                                        array('fields' => array('MenuesInfraestructura.id', 'MenuesInfraestructura.nombre'), 'order' => 'MenuesInfraestructura.nombre',
                                            'conditions' => array('MenuesInfraestructura.obras_tipo_id' => $obras_tipo_id)));
                    }
                }
            } else {
                $this->__save_intervencion_elementos_infraestructura($this->data);
            }
            $referer = $this->referer();
            $this->set(compact('menuesInfraestructuras', 'materiales', 'estados', 'intervencione_id', 'referer'));
            $this->render('edit_intervencion_elementos_infraestructura');
        } else {
            $mensaje = 'No es posible editar la intervención de los elementos de la infraestructura, porque la intervención que está modificando no es la última intervención cargada para la obra de arte. Modificar una intervención vieja, provocaría un cambio en el estado actual de los elementos de la infraestructura con un estado inconsistente.';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function listado_elementos_infraestructura_edit_inters($intervencione_id = null) {
        $this->__aux_listado_elementos_infraestructura_edit_inters($intervencione_id);
    }

    function admin_listado_elementos_infraestructura_edit_inters($intervencione_id = null) {
        $this->__aux_listado_elementos_infraestructura_edit_inters($intervencione_id);
    }

    /**
     * Lista todos los elementos de la infraestructura de la obra para la cual se está registrando
     * la intervención
     */
    function __aux_listado_elementos_infraestructura_edit_inters($intervencione_id = null) {
        $this->layout = false;

        if (!empty($intervencione_id)) {
            $intervencion = $this->Intervencione->findById($intervencione_id);

            $obra_nombre = '';
            $obra_id = 0;
            if (!empty($intervencion)) {
                $obra_id = $intervencion['Intervencione']['obra_id'];
                $obra = $this->Obra->findById($obra_id);
                $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';
            }
            $this->set('obra_nombre', $obra_nombre);
            $this->set('elementosInfraestructurasInters', $this->paginate('ElementosInfraestructura', array('ElementosInfraestructura.obra_id' => $obra_id)));
            $this->render('listado_elementos_infraestructura_editar_intervencion');
        }
    }

    function __save_intervencion_elementos_infraestructura($data = null) {
        if (!empty($data)) {
            if (!empty($data['Intervencione']['intervencione_id']) && !empty($data['ElementosInfraestructura']['id'])) {

                // Verifico si ya existe una intervención registrada para el elemento que estoy editando
                $intervencion_registrada = $this->ElementosInfraestructurasInter->find('all', array('conditions' => array('ElementosInfraestructurasInter.intervencione_id' => $data['Intervencione']['intervencione_id'], 'ElementosInfraestructurasInter.elementos_infraestructura_id' => $data['ElementosInfraestructura']['id'])));

                // Busco en la db, la información actual del elemento de la infraestructura
                $elemento = $this->ElementosInfraestructura->findById($data['ElementosInfraestructura']['id'], array('recursive' => 0));

                $this->ElementosInfraestructura->begin();
                if (empty($intervencion_registrada)) {
                    // Si no existe intervención, guardo la información actual del elemento de la infraestructura en el historial de intervenciones (elementos_infraestructuras_inters)

                    $elementos_infraestructura_inter = array();
                    if (!empty($elemento)) {
                        // Armo el array para hacer el save en el historial de intervenciones (en el modelo "ElementosInfraestructurasInter")
                        $elementos_infraestructura_inter['ElementosInfraestructurasInter'] = $elemento['ElementosInfraestructura'];
                        $elementos_infraestructura_inter['ElementosInfraestructurasInter']['intervencione_id'] = $data['Intervencione']['intervencione_id'];
                        if (!empty($elementos_infraestructura_inter)) {
                            $elementos_infraestructura_inter['ElementosInfraestructurasInter']['elementos_infraestructura_id'] = $elementos_infraestructura_inter['ElementosInfraestructurasInter']['id'];
                            unset($elementos_infraestructura_inter['ElementosInfraestructurasInter']['id']);
                            unset($elementos_infraestructura_inter['ElementosInfraestructurasInter']['obra_id']);

                            // Guardo en el historial de intervenciones (en el modelo "ElementosInfraestructurasInter")
                            $this->ElementosInfraestructurasInter->create();
                            if (!$this->ElementosInfraestructurasInter->save($elementos_infraestructura_inter)) {
                                $this->ElementosInfraestructura->rollback();
                                echo 'La intervención del elemento de la infraestructura no se ha podido guardar.';
                                exit;
                            }
                        }
                    }
                }
                if (!empty($elemento)) {
                    // Antes de modificar la información del elemento de la infraestructura en el modelo
                    // "ElementosInfraestructura", para registrar el resultado de la intervención del elemento:
                    // Primero verifico que la descripción y/o el estado y/o el estado de erosión hidráulica
                    // y/o la fundación del elemento se hayan modificado,
                    // en caso contrario, no registro la intervención del elemento

                    $descripcion_actual = $elemento['ElementosInfraestructura']['descripcion'];
                    $estado_actual = $elemento['ElementosInfraestructura']['estado_id'];
                    $estado_erosion_hidraulica_actual = $elemento['ElementosInfraestructura']['estado_erosion_hidraulica'];
                    $fundacion_actual = $elemento['ElementosInfraestructura']['fundacion'];

                    $descripcion_intervencion = $data['ElementosInfraestructura']['descripcion'];
                    $estado_intervencion = $data['ElementosInfraestructura']['estado_id'];
                    $estado_erosion_hidraulica_intervencion = $data['ElementosInfraestructura']['estado_erosion_hidraulica'];
                    $fundacion_intervencion = $data['ElementosInfraestructura']['fundacion'];

                    if (($descripcion_actual != $descripcion_intervencion) || ($estado_actual != $estado_intervencion) ||
                            ($estado_erosion_hidraulica_actual != $estado_erosion_hidraulica_intervencion) || ($fundacion_actual != $fundacion_intervencion)) {

                        $data['ElementosInfraestructura']['fecha_actualizacion'] = date("Y-m-d H:i:s");
                        $elementos_infraestructura['ElementosInfraestructura'] = $data['ElementosInfraestructura'];

                        if ($this->ElementosInfraestructura->save($elementos_infraestructura)) {
                            if ($this->NivelServicio->save($elemento['ElementosInfraestructura']['obra_id'])) {
                                $this->ElementosInfraestructura->commit();
                                echo 'La intervención del elemento de la infraestructura se guardó correctamente.';
                                exit;
                            } else {
                                $this->ElementosInfraestructura->rollback();
                                echo 'La intervención del elemento de la infraestructura no se ha podido guardar.';
                                exit;
                            }
                        } else {
                            $this->ElementosInfraestructura->rollback();
                            echo 'La intervención del elemento de la infraestructura no se ha podido guardar.';
                            exit;
                        }
                    } else {
                        $this->ElementosInfraestructura->rollback();
                        echo 'La intervención del elemento de la infraestructura no se ha guardado, porque no se ha modificado la información actual del elemento.';
                        exit;
                    }
                } else {
                    $this->ElementosInfraestructura->rollback();
                    echo 'La intervención del elemento de la infraestructura no se ha podido guardar.';
                    exit;
                }
            }
        }
    }


}
?>